package com.copa.l2;

/**
 * @author copa
 * @createDate 2022-04-26 21:23
 * @function 迭代法
 */
public class Test1 {

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        // 定义一个链表
        ListNode result = new ListNode();
        // 定义一个临时链表，为了不让result遍历，如果要result，那么只能显示后面的数据了
        // 按照上面这样做是不合理的，所以我们要定义一个临时链表
        ListNode temp = result;
        // 这个节点是否进1
        int next1 = 0;
        // 当前一个节点总数
        int total = 0;

        // 如果l1和l2都有数据
        while (l1 != null && l2 != null) {
            total = l1.val + l2.val + next1;
            // 一般来说第一个节点不会设置，在下一个节点才设置
            temp.next = new ListNode(total % 10);
            next1 = total / 10;
            l1 = l1.next;
            l2 = l2.next;
            temp = temp.next;
        }

        // 如果l1仍有数据
        while (l1 != null) {
            total = l1.val + next1;
            temp.next = new ListNode(total % 10);
            next1 = total / 10;
            l1 = l1.next;
            temp = temp.next;
        }

        // 如果l2仍有数据
        while (l2 != null) {
            total = l2.val + next1;
            temp.next = new ListNode(total % 10);
            next1 = total / 10;
            l2 = l2.next;
            temp = temp.next;
        }

        // 如果最后的数仍进1，那么再给它创建一个节点即可
        if (next1 != 0) {
            temp.next = new ListNode(next1);
        }

        return result.next;
    }

    public static void main(String[] args) {
        ListNode l1 = new ListNode(2);
        l1.next = new ListNode(4);
        l1.next.next = new ListNode(3);
        ListNode l2 = new ListNode(5);
        l2.next = new ListNode(6);
        l2.next.next = new ListNode(4);
        ListNode listNode = new Test1().addTwoNumbers(l1, l2);
        while (listNode != null) {
            System.out.print(listNode.val + "\t");
            listNode = listNode.next;
        }
    }
}
